<?php
/**
 * 接口控制器基类
 */
class Controller_Interface extends Zend_Controller_Action {

	public function init() {
		parent::init();
		$this->log = new Log();
	}

	/**
	 * 通知请求的签名检查
	 * @param  [type] $data           通知数据;(为null时，从请求参数'data'中获取)
	 * @param  [type] $waitVerifySign 通知签名;(为null时，从请求参数'key'中获取)
	 * @return bool检查通过返回true，不通过返回false
	 */
	public function verifySign($data = null, $waitVerifySign = null) {
		if (is_null($data)) {
			$data = $this->getRequest()->getParam('data', '');
		}
		if (is_null($waitVerifySign)) {
			$waitVerifySign = $this->getRequest()->getParam('key');
		}
		return self::createSign($data) === $waitVerifySign;
	}

	/**
	 * 生成数据的签名
	 * @param  [type] $waitSignData 待签名数据
	 * @return string 生成的签名
	 */
	public static function createSign(string $waitSignData) {
		return Application_Model_Interface::createSign($waitSignData);
	}

	/**
	 * 获取签名的密钥
	 * @return [type] [description]
	 */
	public static function getKey() {
		return Application_Model_Interface::getKey();
	}

	/**
	 * 接口返回错误(返回错误信息，记录错误到日志)
	 * @param  int $status    错误状态值；非1的整数值
	 * @param  string $msg    错误信息
	 * @return void
	 */
	public function error($status, $msg) {
		$log = new Log();
		$requestParamterStr = print_r($this->getRequest()->getParams(), true);
		$logMsg = "处理请求:" . $_SERVER['REQUEST_URI'] . "；发生错误，错误原因:" . $msg . "；此请求参数是:" . $requestParamterStr;
		$log->record($logMsg, Log::WARN);
		$status = $status === 1 ? -$status : $status;
		exit(json_encode(['status' => $status, 'msg' => $msg]));
	}

	/**
	 *发生post请求
	 * @param  [type] $url  [description]
	 * @param  array  $data [description]
	 * @return [type]       [description]
	 */
	public static function post($url, array $data) {
		$dataJson = json_encode($data);
		$signKey = self::createSign($dataJson);

		$response = Requests::POST($url, [], ['data' => $dataJson, 'key' => $signKey]);
		if ($response->success) {
			return $response->body;
		} else {
			return false;
		}
	}

	/**
	 * 接口处理成功
	 * @param  [type] $msg 成功信息
	 * @return void
	 */
	public function success($msg) {
		exit(json_encode(['status' => 1, 'msg' => $msg]));
	}

	/**
	 * 适用于二维数组的字段替换方法 通过本方式转换从接口过来的数据到新数组
	 * @param 源数据
	 * @param 新数据结构 通过该结构转换形成新的数组
	 * @param 存表名称
	 * @param 存储方式 1-更新；2-存储；3-更新或存储
	 * @param 更新时指定的字段
	 * @return array
	 */
	public function mapping($dataFrom, $structure, $clumn, $type = 3, $pk = 'id') {

		$insertVar = '';
		$arr = [];
		foreach ($dataFrom as $key => $values) {
			$update = 'UPDATE ' . $clumn . ' SET ';
			$insertFirst = '(';
			$updateVar = '';
			$insertVar .= '(';
			$duplicate = '';
			foreach ($structure as $k => $v) {
				// 如果能对应这个键
				if (isset($values[$k])) {
					$insertFirst .= $v . ',';
					!is_numeric($values[$k]) && $values[$k] = '"' . $values[$k] . '"';
					$updateVar .= $v . '=' . $values[$k] . ', ';
					$insertVar .= $values[$k] . ',';
					$duplicate .= $v . ' = ' . 'VALUES(' . $v . '), ';
				}
			}
			$insertVar = rtrim($insertVar, ',');
			$insertVar .= '), ';
			$insertFirst = rtrim($insertFirst, ',');
			$insertFirst .= ') VALUES ';
			if ($type == 1) {
				$arr['update'][] = $update .= rtrim($updateVar, ', ');
			}
		}
		$insert = 'INSERT INTO ' . $clumn;
		if ($type == 2) {
			$arr['insert'] = $insert . $insertFirst . rtrim($insertVar, ', ');
		} else if ($type == 3) {
			$arr['insertOnDuplicate'] = $insert . $insertFirst . rtrim($insertVar, ', ') . ' ON DUPLICATE KEY UPDATE ' . rtrim($duplicate, ', ');
		}
		return $arr;
	}

	/**
	 * 转换字段
	 * @param 来源数据
	 * @param 改变后的数据
	 * @param 更新的表
	 * @param 更新条件 多个以数组形式分开
	 * @param 需要递增的字段
	 * @return interger
	 */
	public function mappingUpdate($dataFrom, $structure, $table, $condition = [], $increasing = []) {

		$value = '';
		$where = '';
		set_time_limit(0);
		foreach ($dataFrom as $values) {
			foreach ($structure as $key => $items) {
				if (isset($values[$key])) {
					if (!empty($condition) && in_array($key, $condition)) {
						/*if(!is_numeric($values[$key])){
							$values[$key] = '"' . $values[$key] . '"';
						}*/
						$where .= $items . ' = "' . $values[$key] . '" AND ';
						continue;
					}
					//$value .= $items . ' = ' . $values[$key] . ', ';
					$value[$items] = $values[$key];
				}
			}
			// 循环更新
			Model_Db::getInstance()->update($table, $value, rtrim($where, 'AND '));
			$where = '';
			$value = '';
		}
		return true;
	}
}